<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Continuous Query Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Continuous_Query_Language"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Continuous_Query_Language rootpage-Continuous_Query_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Continuous Query Language</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Die <b>Continuous Query Language</b> (CQL) ist eine <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklarative</a> <a href="Anfragesprache" class="mw-redirect" title="Anfragesprache">Anfragesprache</a> für <a href="Datenstrom" title="Datenstrom">Datenströme</a> in <a href="Data_Stream_Management_System" title="Data Stream Management System">Data Stream Management Systemen</a>. Sie stellt eine Erweiterung der <a href="SQL" title="SQL">SQL</a> dar. Die CQL wurde bis Januar 2006 im Rahmen des <a href="Stanford_Stream_Data_Manager" title="Stanford Stream Data Manager">STREAM</a>-Projekts an der <a href="Stanford_University" title="Stanford University">Stanford University</a> entwickelt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Bestandteile">Bestandteile</h2></div>
<p>Die wesentliche Erweiterung von CQL gegenüber SQL besteht darin, dass zusätzlich zu <a href="Relation_(Datenbank)" title="Relation (Datenbank)">Relationen</a> (Datenbanktabellen) auch <a href="Datenstrom" title="Datenstrom">Datenströme</a> als Datentypen existieren.
</p><p>Datenströme lassen sich als potentiell unendliche Folgen von Zeit-Wertepaaren auffassen.
</p><p>CQL definiert außerdem folgende <i>Operatoren</i>, die in den nachfolgenden Abschnitten erläutert werden:
</p>
<ul><li>der Fenster-Operator <code><a href="#Fenster">[...]</a></code></li>
<li>der Insert-Stream-Operator <code><a href="#Insert-Stream">ISTREAM</a></code></li>
<li>der Delete-Stream-Operator <code><a href="#Delete-Stream">DSTREAM</a></code></li>
<li>der Relation-Stream-Operator <code><a href="#Relation-Stream">RSTREAM</a></code></li>
<li>der Stichproben-Operator <code><a href="#Samples">SAMPLE</a></code> für die Auswahl aus einem Datenstrom.</li></ul>
<p>Für die Transformation zwischen Relationen können die herkömmlichen Operatoren aus SQL verwendet werden.
</p><p>Die Umwandlung von Strömen in andere Ströme findet über den Umweg von Relationen statt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiele">Beispiele</h2></div>
<p>Es werden kontinuierlich Wetterdaten gemessen, die als Datenstrom in einer Applikation ankommen. Der folgende CQL-Ausdruck liefert mit Hilfe eines Fenster-Operators die Durchschnittstemperatur der letzten 24 Stunden:
</p>
<dl><dd><code>SELECT AVG(Temperatur) FROM Wetter [Range 1 Day]</code></dd></dl>
<p>Da es sich um eine kontinuierliche Anfrage handelt, wird diese per Istream standardmäßig wieder in einen Datenstrom umgewandelt. Die vollständige Anfrage lautet also:
</p>
<dl><dd><code>SELECT ISTREAM(AVG(Temperatur) FROM Wetter [Range 1 Day])</code></dd></dl>
<p>In einer anderen Datenbank werden von einem Blitzortungssystem erkannte Blitze mit ihren Koordinaten eingetragen. Folgende Anfrage erzeugt daraus einen Datenstrom:
</p>
<dl><dd><code>SELECT ISTREAM(position) FROM Blitz</code></dd></dl>
<p>In Kombination mit weiteren Daten lässt sich beispielsweise ein Datenstrom von Blitzen in ausgewählten Gebieten erzeugen und als aktuelle Blitzwarnung ausgeben.
</p>
<div class="mw-heading mw-heading2"><h2 id="Die_Operatoren_im_Einzelnen">Die Operatoren im Einzelnen</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Fenster">Fenster</h3></div>
<p>Zur Umwandlung von Strömen in Relationen wird ein <i>Fenster</i> definiert. Die Syntax dafür ist
<code>S [W]</code>, wobei <code>S</code> ein Strom und <code>W</code> ein Fenster ist. Das Fenster kann durch einen Zeitraum oder durch eine Anzahl von Tupeln angegeben werden:
</p>
<dl><dd><code>[Rows 100]</code> liefert beispielsweise die jeweils 100 letzten Tupel</dd>
<dd><code>[Range 5 Seconds]</code> liefert beispielsweise die Tupel der letzten 5 Sekunden</dd></dl>
<p>Wird kein Fenster angegeben, so wird <code>[∞]</code> angenommen, das heißt, die Relation enthält alle Tupel aus dem Datenstrom bis zum aktuellen Zeitpunkt. Zusätzlich kann eine Beschränkung durch eine <code>WHERE</code>-Klausel und bei durch Tupelanzahl-basierten Fenstern eine Gruppierung mit <code>PARTITION BY</code> angegeben werden.
</p><p>In folgendem Beispiel sei ein Strom „Bestellung“ mit den Attributen „Kunde“ und „Zahlungsart“ gegeben. Folgende Anfrage liefert jeweils die 5 letzten Bestellungen eines jeden Kunden, der mit Kreditkarte gezahlt hat.
</p>
<dl><dd><code>SELECT * FROM Bestellungen B<br> [PARTITION BY B.Kunde ROWS 5]<br> WHERE B.Zahlungsart = 'Kreditkarte'</code></dd></dl>
<p>In Verbindung mit dem Operator <code>RSTREAM</code> sind zusätzlich die Schlüsselwörter <code>NOW</code> und <code>SLIDE</code> möglich (siehe dort).
</p>
<div class="mw-heading mw-heading3"><h3 id="Insert-Stream">Insert-Stream</h3></div>
<p>Mit dem Operator <code>ISTREAM</code> wird aus einer Relation ein Datenstrom erstellt, bei dem jedes Mal, wenn ein Tupel in die Relation eingefügt wird, eine Kopie an den Datenstrom gesandt wird – allerdings nur, wenn es sich bei den eingefügten Tupeln nicht um Duplikate handelt. Die folgende Anfrage liefert mit jeder neuen Bestellung die Anzahl der Bestellungen innerhalb der letzten Stunde:
</p>
<dl><dd><code>SELECT ISTREAM(COUNT(*)) FROM Bestellungen B [Range 1 Hour]</code></dd></dl>
<div class="mw-heading mw-heading3"><h3 id="Delete-Stream">Delete-Stream</h3></div>
<p>Mit dem Operator <code>DSTREAM</code> wird aus einer Relation ein Datenstrom erstellt, bei dem jedes Mal, wenn ein Tupel aus einer Relation entfernt wird, dieses Tupel an den Datenstrom gesandt wird. Die folgende Anfrage liefert die gelöschten Kunden als Datenstrom:
</p>
<dl><dd><code>DSTREAM (SELECT * FROM Kunden)</code></dd></dl>
<div class="mw-heading mw-heading3"><h3 id="Relation-Stream">Relation-Stream</h3></div>
<p>Der Operator <code>RSTREAM</code> wandelt eine gesamte Relation in einen Datenstrom um. Das heißt, alle Tupel, die zum gegenwärtigen Zeitpunkt in der Relation enthalten sind, werden an den Datenstrom gesandt.
</p><p>Das Schlüsselwort <code>NOW</code> für die Länge eines Fensters liefert in Verbindung mit dem Operator <code>RSTREAM</code> den aktuellen Wert. In folgendem Beispiel seien zwei Ströme Verbindungsaufbau und Verbindungsende gegeben, die jeweils den Anfang und das Ende einer Kommunikationsverbindung liefern. Die folgende Anfrage liefert fortlaufend alle abgeschlossenen Verbindungen, die höchstens 5 Minuten gedauert haben.
</p>
<dl><dd><code>SELECT RSTREAM(A.*)</code></dd>
<dd><code>FROM Verbindungsaufbau [Range 5 Minutes] A, Verbindungsende [Now] E</code></dd>
<dd><code>WHERE A.id = E.id</code></dd></dl>
<p>Mit dem Schlüsselwort <code>SLIDE</code> kann für ein Fenster angegeben werden, wie oft es aktualisiert werden soll, beziehungsweise wann das Fenster verschoben werden soll. Die folgende Anfrage liefert beispielsweise täglich das gleitende Monatsmittel der gesamten Bestellsumme aus einem Strom von Bestellungen:
</p>
<dl><dd><code>SELECT RSTREAM( AVG(B.Summe) ) FROM Bestellungen B [Range 1 Month Slide 1 Day]</code></dd></dl>
<div class="mw-heading mw-heading3"><h3 id="Samples">Samples</h3></div>
<p>Um eine zufällige Auswahl aus einem Stream zu bekommen, gibt es den Operator <code>SAMPLE</code>, dem eine Prozentzahl übergeben wird. Beispielsweise gibt die Anfrage <code>SELECT * FROM T SAMPLE(10)</code> aus dem Stream <code>T</code> jedes Element nur mit einer Wahrscheinlichkeit von 10 % aus, so dass im Durchschnitt nur jedes zehnte in den Ergebnisstrom übernommen wird.
</p>
<div class="mw-heading mw-heading2"><h2 id="Bewertung">Bewertung</h2></div>
<p>Ein wesentlicher Vorteil der CQL ist, dass sie direkt auf der – nur teilweise deklarativen – SQL aufbaut und die Anfragen <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklarativ</a> formuliert werden können. Dies setzt jedoch im DSMS effiziente Verfahren zur Umformulierung der Anfrage in einen Anfrageplan voraus.
</p><p>Mit STREAM konkurrierende Systeme verwenden entweder direkt ein <a href="Imperative_Programmierung" title="Imperative Programmierung">imperatives Modell</a> zur Formulierung von Anfragen (beispielsweise Aurora/Borealis) oder besitzen eine mit CQL vergleichbare Syntax (TelegraphCQ) beziehungsweise ermöglichen prinzipiell auch die Ausführung von CQL-Anfragen (PIPES).
</p><p>Die Verarbeitung von Anfragen über <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>-Datenströmen stellt ein eigenes Forschungsgebiet dar, in dessen Rahmen auf <a href="XPath" title="XPath">XPath</a> statt auf SQL aufbauende Anfragesprachen entwickelt werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Kalk%C3%BCl_(Datenbank)" title="Kalkül (Datenbank)">Kalkül (Datenbank)</a></li>
<li><a href="Relationale_Algebra" title="Relationale Algebra">Relationale Algebra</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Brian Babcock, Shivnath Babu, Mayur Datar, <a href="Rajeev_Motwani" title="Rajeev Motwani">Rajeev Motwani</a>, <a href="Jennifer_Widom" title="Jennifer Widom">Jennifer Widom</a>: <i><a rel="nofollow" class="external text" href="http://dbpubs.stanford.edu:8090/pub/2002-19">Models and Issues in Data Stream Systems</a></i>. PODS 2002, Madison, Wisconsin.</li>
<li>Arvind Arasu, Shivnath Babu, Jennifer Widom: <i><a rel="nofollow" class="external text" href="http://dbpubs.stanford.edu/pub/2003-67">The CQL Continuous Query Language: Semantic Foundations and Query Execution</a></i>. Stanford, 2003 (Technical Report)</li>
<li>Rajeev Motwani, Jennifer Widom, Arvind Arasu, Brian Babcock, Shivnath Babu, Mayur Datar, Gurmeet Manku, Chris Olston, Justin Rosenstein und Rohit Varma: <i><a rel="nofollow" class="external text" href="http://newdbpubs.stanford.edu:8090/pub/2002-41">Query Processing, Resource Management, and Approximation in a Data Stream Management System</a></i>. Stanford, 2002 (CIDR 2003)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www-db.stanford.edu/stream/">Stanford Stream Data Manager</a> (STREAM; englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www-db.stanford.edu/stream/demo/cql_primer.html">CQL-Einführung</a> aus STREAM (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www-db.stanford.edu/stream/demo/cql_spec.txt">CQL-Spezifikation</a> für STREAM (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www-db.stanford.edu/stream/sqr/">Stream Query Repository</a> – eine Sammlung von Anfragen in CQL (englisch)</li></ul>
</div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2022-08-14" href="https://de.wikipedia.org/wiki/?title=Continuous_Query_Language&oldid=225333577">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>